home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Reference Guide / C-C++ Interactive Reference Guide.iso / c_ref / csource4 / 219_01 / a48.h < prev    next >
Text File  |  1989-01-13  |  13KB  |  428 lines

  1. /*
  2.     HEADER:        CUG219;
  3.     TITLE:        8048 Cross-Assembler (Portable);
  4.     FILENAME:    A48UTIL.C;
  5.     VERSION:    0.2;
  6.     DATE:        11/09/1988;
  7.  
  8.     DESCRIPTION:    "This program lets you use your computer to assemble
  9.             code for the Intel 8048 family of microprocessors.
  10.             The program is written in portable C rather than BDS
  11.             C.  All assembler features are supported except
  12.             relocation, linkage, and macros.";
  13.  
  14.     KEYWORDS:    Software Development, Assemblers, Cross-Assemblers,
  15.             Intel, 8048;
  16.  
  17.     SYSTEM:        CP/M-80, CP/M-86, HP-UX, MSDOS, PCDOS, QNIX;
  18.     COMPILERS:    Aztec C86, Aztec CII, CI-C86, Eco-C, Eco-C88, HP-UX,
  19.             Lattice C, Microsoft C,    QNIX C;
  20.  
  21.     WARNINGS:    "This program has compiled successfully on 2 UNIX
  22.             compilers, 5 MSDOS compilers, and 2 CP/M compilers.
  23.             A port to Toolworks C is untried."
  24.  
  25.     AUTHORS:    William C. Colley III;
  26. */
  27.  
  28. /*
  29.               8048 Cross-Assembler in Portable C
  30.  
  31.         Copyright (c) 1985,1987 William C. Colley, III
  32.  
  33. Revision History:
  34.  
  35. Ver    Date        Description
  36.  
  37. 0.0    APR 1987    Adapted from version 2.4 of my portable 1805A cross-
  38.             assembler.  WCC3.
  39.  
  40. 0.1    AUG 1988    Fixed a bug in the command line parser that puts it
  41.             into a VERY long loop if the user types a command line
  42.             like "A48 FILE.ASM -L".  WCC3 per Alex Cameron.
  43.  
  44. 0.2    NOV 1988    Fixed a name conflict between a variable and a goto
  45.             label that caused some compilers to choke.  WCC3.
  46.  
  47. This header file contains the global constants and data type definitions for
  48. all modules of the cross-assembler.  This also seems a good place to put the
  49. compilation and linkage instructions for the animal.  This list currently
  50. includes the following compilers:
  51.  
  52.         Compiler Name        Op. Sys.    Processor
  53.  
  54.     1)  Aztec C86            CP/M-86        8086, 8088
  55.                     MSDOS/PCDOS
  56.  
  57.     2)  AZTEC C II            CP/M-80        8080, Z-80
  58.  
  59.     3)  Computer Innovations C86    MSDOS/PCDOS    8086, 8088
  60.  
  61.     4)  Eco-C            CP/M-80        Z-80
  62.  
  63.     5)  Eco-C88            MSDOS/PCDOS    8086, 8088
  64.  
  65.     6)  HP C            HP-UX        68000
  66.  
  67.     7)  Lattice C            MSDOS/PCDOS    8086, 8088
  68.  
  69.     8)  Microsoft C            MSDOS/PCDOS    8086, 8088
  70.  
  71.     9)  QNIX C            QNIX        8086, 8088
  72.  
  73. Further additions will be made to the list as users feed the information to
  74. me.  This particularly applies to UNIX and IBM-PC compilers.
  75.  
  76. Compile-assemble-link instructions for this program under various compilers
  77. and operating systems:
  78.  
  79.     1)    Aztec C86:
  80.  
  81.     A)  Uncomment out the "#define AZTEC_C" line and comment out all
  82.         other compiler names in A48.H.
  83.  
  84.     B)  Assuming that all files are on drive A:, run the following sequence
  85.         of command lines:
  86.  
  87.         A>cc a48
  88.         A>cc a48eval
  89.         A>cc a48util
  90.         A>ln a48.o a48eval.o a48util.o -lc
  91.         A>era a48*.o
  92.  
  93.     2)  Aztec CII (version 1.06B):
  94.  
  95.     A)  Uncomment out the "#define AZTEC_C" line and comment out all
  96.         other compiler names in A48.H.
  97.  
  98.     B)  Assuming the C compiler is called "CC.COM" and all files are
  99.         on drive A:, run the following sequence of command lines:
  100.  
  101.         A>cc a48
  102.         A>as -zap a48
  103.         A>cc a48eval
  104.         A>as -zap a48eval
  105.         A>cc a48util
  106.         A>as -zap a48util
  107.         A>ln a48.o a48eval.o a48util.o -lc
  108.         A>era a48*.o
  109.  
  110.     3)  Computer Innovations C86:
  111.  
  112.     A)  Uncomment out the "#define CI_C86" line and comment out all
  113.         other compiler names in A48.H.
  114.  
  115.     B)  Compile the files A48.C, A48EVAL.C, and A48UTIL.C.  Link
  116.         according to instructions that come with the compiler.
  117.  
  118.     4)  Eco-C (CP/M-80 version 3.10):
  119.  
  120.     A)  Uncomment out the "#define ECO_C" line and comment out all
  121.         other compiler names in A48.H.
  122.  
  123.     B)  Assuming all files are on drive A:, run the following sequence of
  124.         command lines:
  125.  
  126.         A>cp a48 -i -m
  127.         A>cp a48eval -i -m
  128.         A>cp a48util -i -m
  129.         A>l80 a48,a48eval,a48util,a48/n/e
  130.         A>era a48*.mac
  131.         A>era a48*.rel
  132.  
  133.     5)  Eco-C88:
  134.  
  135.     A)  Uncomment out the "#define ECO_C" line and comment out all
  136.         other compiler names in A48.H.
  137.  
  138.     B)  Compile the files A48.C, A48EVAL.C, and A48UTIL.C.  Link
  139.         according to instructions that come with the compiler.
  140.  
  141.     6)  HP-UX (a UNIX look-alike running on an HP-9000 Series 200/500,
  142.     68000-based machine):
  143.  
  144.     A)  Uncomment out the "#define HP_UX" line and comment out all
  145.         other compiler names in A48.H.
  146.  
  147.     B)  Run the following command line:
  148.  
  149.         . cc a48.c a48eval.c a48util.c
  150.  
  151.     7)  Lattice C:
  152.  
  153.     A)  Uncomment out the "#define LATTICE_C" line and comment out all
  154.         other compiler names in A48.H.
  155.  
  156.     B)  Compile the files A48.C, A48EVAL.C, and A48UTIL.C.  Link
  157.         according to instructions that come with the compiler.
  158.  
  159.     8)  Microsoft C (version 3.00):
  160.  
  161.     A)  Uncomment out the "#define MICROSOFT_C" line and comment out all
  162.         other compiler names in A68.H.
  163.  
  164.     B)  Run the following command line:
  165.  
  166.         C>cl a48.c a48eval.c a48util.c
  167.  
  168.     9)    QNIX C:
  169.  
  170.     A)  Uncomment out the "#define QNIX" line and comment out all other
  171.         compiler names in A48.H.
  172.  
  173.     B)  Run the following command line:
  174.  
  175.         . cc a48.c a48eval.c a48util.c
  176.  
  177. Note that, under CP/M-80, you can't re-execute a core image from a previous
  178. assembly run with the "@.COM" trick.  This technique is incompatible with the
  179. Aztec CII compiler, so I didn't bother to support it at all.
  180. */
  181.  
  182. #include <stdio.h>
  183.  
  184. /*  Comment out all but the line containing the name of your compiler:    */
  185.  
  186. #define        AZTEC_C
  187. /* #define    CI_C86                            */
  188. /* #define    ECO_C                            */
  189. /* #define    HP_UX                            */
  190. /* #define    LATTICE_C                        */
  191. /* #define    MICROSOFT_C                        */
  192. /* #define    QNIX                            */
  193.  
  194. /*  Compiler dependencies:                        */
  195.  
  196. #ifdef    AZTEC_C
  197. #define    getc(f)        agetc(f)
  198. #define    putc(c,f)    aputc(c,f)
  199. #endif
  200.  
  201. #ifndef    ECO_C
  202. #define    FALSE        0
  203. #define    TRUE        (!0)
  204. #endif
  205.  
  206. #ifdef    LATTICE_C
  207. #define    void        int
  208. #endif
  209.  
  210. #ifdef    QNIX
  211. #define    fprintf        tfprintf
  212. #define    printf        tprintf
  213. #endif
  214.  
  215. /*  On 8-bit machines, the static type is as efficient as the register    */
  216. /*  type and far more efficient than the auto type.  On larger machines    */
  217. /*  such as the 8086 family, this is not necessarily the case.  To    */
  218. /*  let you experiment to see what generates the fastest, smallest code    */
  219. /*  for your machine, I have declared internal scratch variables in    */
  220. /*  functions "SCRATCH int", "SCRATCH unsigned", etc.  A SCRATCH    */
  221. /*  varible is made static below, but you might want to try register    */
  222. /*  instead.                                */
  223.  
  224. #define    SCRATCH        static
  225.  
  226. /*  A slow, but portable way of cracking an unsigned into its various    */
  227. /*  component parts:                            */
  228.  
  229. #define    clamp(u)    ((u) &= 0xffff)
  230. #define    high(u)        (((u) >> 8) & 0xff)
  231. #define    low(u)        ((u) & 0xff)
  232. #define    word(u)        ((u) & 0xffff)
  233.  
  234. /*  The longest source line the assembler can hold without exploding:    */
  235.  
  236. #define    MAXLINE        255
  237.  
  238. /*  The maximum number of source files that can be open simultaneously:    */
  239.  
  240. #define    FILES        4
  241.  
  242. /*  The fatal error messages generated by the assembler:        */
  243.  
  244. #define    ASMOPEN        "Source File Did Not Open"
  245. #define    ASMREAD        "Error Reading Source File"
  246. #define    DSKFULL        "Disk or Directory Full"
  247. #define    FLOFLOW        "File Stack Overflow"
  248. #define    HEXOPEN        "Object File Did Not Open"
  249. #define    IFOFLOW        "If Stack Overflow"
  250. #define    LSTOPEN        "Listing File Did Not Open"
  251. #define    NOASM        "No Source File Specified"
  252. #define    SYMBOLS        "Too Many Symbols"
  253.  
  254. /*  The warning messages generated by the assembler:            */
  255.  
  256. #define    BADOPT        "Illegal Option Ignored"
  257. #define    NOHEX        "-o Option Ignored -- No File Name"
  258. #define    NOLST        "-l Option Ignored -- No File Name"
  259. #define    TWOASM        "Extra Source File Ignored"
  260. #define    TWOHEX        "Extra Object File Ignored"
  261. #define    TWOLST        "Extra Listing File Ignored"
  262.  
  263. /*  Line assembler (A48.C) constants:                    */
  264.  
  265. #define    BIGINST        2        /* longest instruction length    */
  266. #define    IFDEPTH        16        /* maximum IF nesting level    */
  267. #define    NOP        0x00        /* processor's NOP opcode    */
  268. #define    ON        1        /* assembly turned on        */
  269. #define    OFF        -1        /* assembly turned off        */
  270.  
  271. /*  Line assembler (A48.C) opcode attribute word flag masks:        */
  272.  
  273. #define    PSEUDO        0x8000        /* is pseudo-op            */
  274. #define    ISIF        0x4000        /* is IF, ELSE, or ENDI        */
  275. #define    OPTYPE        0x3c00        /* opcode type:            */
  276. #define    NO_ARG        0x0000        /*    NOP, RET, RETR        */
  277. #define    ONE_ARG        0x0400        /*    DA, EN, JMPP, STOP, ...    */
  278. #define    INC_DEC        0x0800        /*    DEC, INC        */
  279. #define    OUTPUT        0x0c00        /*    ANLD, OUTL, ORLD    */
  280. #define    A_AT_A        0x1000        /*    MOVP, MOVP3        */
  281. #define    A_REG_1        0x1400        /*    IN, INS, XCH, XCHD    */
  282. #define    A_REG_2        0x1800        /*    MOVD, MOVX        */
  283. #define    ADD_OP        0x1c00        /*    ADD, ADDC, XRL        */
  284. #define    LOG_OP        0x2000        /*    ANL, ORL        */
  285. #define    REG_CND        0x2400        /*    DJNZ            */
  286. #define    JMP_CND        0x2800        /*    JB0, JTF, JF0, JNZ, ...    */
  287. #define    LNG_JMP        0x2c00        /*    JMP, CALL        */
  288. #define    MOV        0x3000        /*    MOV            */
  289. #define    MIN_TAG        0x03f0        /* minimum register argument    */
  290. #define    N_TAGS        0x000f        /* # of allowable register args    */
  291.  
  292. /*  Line assembler (A48.C) pseudo-op opcode token values:        */
  293.  
  294. #define    DB        0
  295. #define    DS        1
  296. #define    DW        2
  297. #define    ELSE        3
  298. #define    END        4
  299. #define    ENDIF        5
  300. #define    EQU        6
  301. #define    IF        7
  302. #define    INCL        8
  303. #define    ORG        9
  304. #define    REGI        10
  305. #define    PAGE        11
  306. #define    SET        12
  307. #define    TITL        13
  308.  
  309. /*  Lexical analyzer (A48EVAL.C) token buffer and stream pointer:    */
  310.  
  311. typedef struct {
  312.     unsigned attr;
  313.     unsigned valu;
  314.     char sval[MAXLINE + 1];
  315. } TOKEN;
  316.  
  317. /*  Lexical analyzer (A48EVAL.C) token attribute values:        */
  318.  
  319. #define    EOL        0    /*  end of line                */
  320. #define    SEP        1    /*  field separator            */
  321. #define    OPR        2    /*  operator                */
  322. #define    STR        3    /*  character string            */
  323. #define    VAL        4    /*  value                */
  324. #define    REG        5    /*  register or other tag        */
  325. #define    IMM        6    /*  immediate mode flag (#)        */
  326.  
  327. /*  Lexical analyzer (A48EVAL.C) token attribute word flag masks:    */
  328.  
  329. #define    BINARY        0x8000    /*  Operator:    is binary operator    */
  330. #define    UNARY        0x4000    /*        is unary operator    */
  331. #define    PREC        0x0f00    /*        precedence        */
  332.  
  333. #define    FORWD        0x8000    /*  Value:    is forward referenced    */
  334. #define    SOFT        0x4000    /*        is redefinable        */
  335.  
  336. #define    TYPE        0x000f    /*  All:    token type        */
  337.  
  338. /*  Lexical analyzer (A48EVAL.C) register token values:            */
  339. #define    AT_A        0x00    /*  @A                    */
  340. #define    F0        0x01    /*  F0                    */
  341. #define    F1        0x02    /*  F1                    */
  342. #define    C        0x03    /*  C                    */
  343. #define    A        0x04    /*  A                    */
  344. #define    R0        0x05    /*  R0                    */
  345. #define    R1        0x06    /*  R1                    */
  346. #define    R2        0x07    /*  R2                    */
  347. #define    R3        0x08    /*  R3                    */
  348. #define    R4        0x09    /*  R4                    */
  349. #define    R5        0x0a    /*  R5                    */
  350. #define    R6        0x0b    /*  R6                    */
  351. #define    R7        0x0c    /*  R7                    */
  352. #define    AT_R0        0x0d    /*  @R0                    */
  353. #define    AT_R1        0x0e    /*  @R1                    */
  354. #define    BUS        0x12    /*  BUS                    */
  355. #define    P1        0x13    /*  P1                    */
  356. #define    P2        0x14    /*  P2                    */
  357. #define    P4        0x15    /*  P4                    */
  358. #define    P5        0x16    /*  P5                    */
  359. #define    P6        0x17    /*  P6                    */
  360. #define    P7        0x18    /*  P7                    */
  361. #define    CLK        0x19    /*  CLK                    */
  362. #define    CNT        0x1a    /*  CNT                    */
  363. #define    T        0x1b    /*  T                    */
  364. #define    TCNT        0x1c    /*  TCNT                */
  365. #define    TCNTI        0x1d    /*  TCNTI                */
  366. #define    I        0x1e    /*  I                    */
  367. #define    PSW        0x1f    /*  PSW                    */
  368. #define    MB0        0x20    /*  MB0                    */
  369. #define    MB1        0x21    /*  MB1                    */
  370. #define    RB0        0x22    /*  RB0                    */
  371. #define    RB1        0x23    /*  RB1                    */
  372.  
  373. /*  Lexical analyzer (A48EVAL.C) operator token values (unlisted ones    */
  374. /*  use ASCII characters):                        */
  375.  
  376. #define    AND        0
  377. #define    GE        1
  378. #define    HIGH        2
  379. #define    LE        3
  380. #define    LOW        4
  381. #define    MOD        5
  382. #define    NE        6
  383. #define    NOT        7
  384. #define    OR        8
  385. #define    SHR        9
  386. #define    SHL        10
  387. #define    XOR        11
  388.  
  389. /*  Lexical analyzer (A48EVAL.C) operator precedence values:        */
  390.  
  391. #define    UOP1        0x0000    /*  unary +, unary -            */
  392. #define    MULT        0x0100    /*  *, /, MOD, SHL, SHR            */
  393. #define    ADDIT        0x0200    /*  binary +, binary -            */
  394. #define    RELAT        0x0300    /*  >, >=, =, <=, <, <>            */
  395. #define    UOP2        0x0400    /*  NOT                    */
  396. #define    LOG1        0x0500    /*  AND                    */
  397. #define    LOG2        0x0600    /*  OR, XOR                */
  398. #define    UOP3        0x0700    /*  HIGH, LOW                */
  399. #define    RPREN        0x0800    /*  )                    */
  400. #define    LPREN        0x0900    /*  (                    */
  401. #define    ENDEX        0x0a00    /*  end of expression            */
  402. #define    START        0x0b00    /*  beginning of expression        */
  403.  
  404. /*  Utility package (A48UTIL.C) symbol table routines:            */
  405.  
  406. struct _symbol {
  407.     unsigned attr;
  408.     unsigned valu;
  409.     struct _symbol *left, *right;
  410.     char sname[1];
  411. };
  412.  
  413. typedef struct _symbol SYMBOL;
  414.  
  415. #define    SYMCOLS        4
  416.  
  417. /*  Utility package (A48UTIL.C) opcode/operator table routines:        */
  418.  
  419. typedef struct {
  420.     unsigned attr;
  421.     unsigned valu;
  422.     char oname[6];
  423. } OPCODE;
  424.  
  425. /*  Utility package (A48UTIL.C) hex file output routines:        */
  426.  
  427. #define    HEXSIZE        32
  428. #define    UOP1        0x0000    /*  unary +, unary -